 'use strict';

const ls = window.localStorage,
    Browser = { name: 'unknown', version: 0 },  
    userAgent = window.navigator.userAgent.toLowerCase();

if ( /(msie|firefox|opera|chrome|netscape)\D+(\d[\d.]*)/.test( userAgent ) ){
    Browser.name = RegExp.$1;  
    Browser.version = RegExp.$2;  
} else if ( /version\D+(\d[\d.]*).*safari/.test( userAgent ) ){
    Browser.name = 'safari';  
    Browser.version = RegExp.$2;  
}  

// 是否使用Timer来check
const useOnstorage =  (Browser.name ==='msie' && K.Browser.version < 8) || (Browser.name === 'chrome');

export class LocalStorage {
    getItem (key) {
        var item = ls.getItem(key);
        if (!item) {
            return;
        }
        item = JSON.parse(item);
        if (item.expires) {
            const expires = Number(item.expires);
            if (!isNaN(expires) && expires <= new Date().getTime()) {
                return item.value;
            }

            return this.removeItem(key);
        }
        return item.value;
    }

    /**
     * 存储
     * @param {string|number} key 
     * @param {*} val 
     * @param {object} opts.expires 过期时间单位秒 
     */ 

    setItem(key, val, opts ) {
        opts = 'object' === typeof opts ? opts : { expires: 0};
        
        let expires = 'number' === typeof opts && !isNaN(expires) ? expires : 0;
        if (expires > 0) {
            expires = new Date().getTime() + expires * 1000; 
            val = JSON.stringify({value: val, expires: expires});
        }else {
            val = JSON.stringify({value: val});
        }

        return ls.setItem(key, val);
    }

    removeItem(key, val) {
        return ls.removeItem(key);
    }

    clear() {
        return ls.clear();
    }

    onstorage(key, callback, interval) {  
        /*  
            IE6/IE7/Chrome使用Timer检查更新，其他使用onstorage事件 
            IE下即使是当前页面触发的数据变更，当前页面也能收到onstorage事件，其他浏览器则只会在其他页面收到    
            Chrome下(14.0.794.0)重写了document.domain之后会导致onstorage不触发     
            鉴于onstorage的兼容性问题暂时不使用onstorage事件，改用传统的轮询方式检查数据变化       
        */
        var oldValue = ls[key];
        function handler(e) {
            //IE下不使用setTimeout尽然获取不到改变后的值?!       
            setTimeout(function () {
                e = e || window.storageEvent;

                var eKey = e.key, newValue = e.newValue;
                //IE下不支持key属性,因此需要根据storage中的数据判断key中的数据是否变化       
                if (!eKey) {
                    var nv = ls[key];
                    if (nv != oldValue) {
                        eKey = key;
                        newValue = nv;
                    }
                }

                if (eKey == key) {

                    'function' === typeof callback && callback(newValue);
                    oldValue = newValue;
                }
            }, 0);
        } 

        if (useOnstorage) {
            //检查storage是否发生变化的时间间隔
            if ('number' !== typeof interval) { 
                interval = 1000;
            }
            setInterval(function () {
                handler({});
            }, interval);
        } else {
            //IE注册在document上       
            if (document.attachEvent && Browser.name !== 'opera') {
                document.attachEvent("onstorage",handler);
            } else {
                //其他注册在window上   
                window.addEventListener("storage", handler, false);
            };
        }
    }
}

// 代理方式

// eg ll[1] = 2 ===> 存储 1:2
// eg ll[1] ===> 获取 1: 2

// var ll = new Proxy(new LocalStorage(), {
// 	get (target, key){
// 		if (target[key]) {
//             return target[key];
//         }
//         return target.getItem(key);
//     },
//     set (target,key, value){
//         target.setItem(key, value);
// 	} 
// });